<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0014)about:internet -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Social Network Evolution and Meme Diffusion in a Student Dorm</title>

<base target="_blank"/>

<style type="text/css">
body, td {
   font-family: sans-serif;
   background-color: white;
   font-size: 12px;
   margin: 8px;
}

tt, code, pre {
   font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;
}

h1 { 
   font-size:2.2em; 
}

h2 { 
   font-size:1.8em; 
}

h3 { 
   font-size:1.4em; 
}

h4 { 
   font-size:1.0em; 
}

h5 { 
   font-size:0.9em; 
}

h6 { 
   font-size:0.8em; 
}

a:visited {
   color: rgb(50%, 0%, 50%);
}

pre {	
   margin-top: 0;
   max-width: 95%;
   border: 1px solid #ccc;
}

pre code {
   display: block; padding: 0.5em;
}

code.r {
   background-color: #F8F8F8;
}

table, td, th {
  border: none;
}

blockquote {
   color:#666666;
   margin:0;
   padding-left: 1em;
   border-left: 0.5em #EEE solid;
}

hr {
   height: 0px;
   border-bottom: none;
   border-top-width: thin;
   border-top-style: dotted;
   border-top-color: #999999;
}

@media print {
   * { 
      background: transparent !important; 
      color: black !important; 
      filter:none !important; 
      -ms-filter: none !important; 
   }

   body { 
      font-size:12pt; 
      max-width:100%; 
   }
       
   a, a:visited { 
      text-decoration: underline; 
   }

   hr { 
      visibility: hidden;
      page-break-before: always;
   }

   pre, blockquote { 
      padding-right: 1em; 
      page-break-inside: avoid; 
   }

   tr, img { 
      page-break-inside: avoid; 
   }

   img { 
      max-width: 100% !important; 
   }

   @page :left { 
      margin: 15mm 20mm 15mm 10mm; 
   }
     
   @page :right { 
      margin: 15mm 10mm 15mm 20mm; 
   }

   p, h2, h3 { 
      orphans: 3; widows: 3; 
   }

   h2, h3 { 
      page-break-after: avoid; 
   }
}

</style>

<!-- Styles for R syntax highlighter -->
<style type="text/css">
   pre .operator,
   pre .paren {
     color: rgb(104, 118, 135)
   }

   pre .literal {
     color: rgb(88, 72, 246)
   }

   pre .number {
     color: rgb(0, 0, 205);
   }

   pre .comment {
     color: rgb(76, 136, 107);
   }

   pre .keyword {
     color: rgb(0, 0, 255);
   }

   pre .identifier {
     color: rgb(0, 0, 0);
   }

   pre .string {
     color: rgb(3, 106, 7);
   }
</style>

<!-- R syntax highlighter -->
<script type="text/javascript">
var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function f(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function b(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function h(t,s){var p="";for(var r=0;r<t.childNodes.length;r++){if(t.childNodes[r].nodeType==3){var q=t.childNodes[r].nodeValue;if(s){q=q.replace(/\n/g,"")}p+=q}else{if(t.childNodes[r].nodeName=="BR"){p+="\n"}else{p+=h(t.childNodes[r])}}}if(/MSIE [678]/.test(navigator.userAgent)){p=p.replace(/\r/g,"\n")}return p}function a(s){var r=s.className.split(/\s+/);r=r.concat(s.parentNode.className.split(/\s+/));for(var q=0;q<r.length;q++){var p=r[q].replace(/^language-/,"");if(e[p]){return p}}}function c(q){var p=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{if(s.childNodes[r].nodeType==1){p.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);p.push({event:"stop",offset:t,node:s.childNodes[r]})}}}}return t})(q,0);return p}function k(y,w,x){var q=0;var z="";var s=[];function u(){if(y.length&&w.length){if(y[0].offset!=w[0].offset){return(y[0].offset<w[0].offset)?y:w}else{return w[0].event=="start"?y:w}}else{return y.length?y:w}}function t(D){var A="<"+D.nodeName.toLowerCase();for(var B=0;B<D.attributes.length;B++){var C=D.attributes[B];A+=" "+C.nodeName.toLowerCase();if(C.value!==undefined&&C.value!==false&&C.value!==null){A+='="'+m(C.value)+'"'}}return A+">"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);s.splice(r,1);while(r<s.length){z+=t(s[r]);r++}}}}return z+m(x.substr(q))}function j(){function q(x,y,v){if(x.compiled){return}var u;var s=[];if(x.k){x.lR=f(y,x.l||hljs.IR,true);for(var w in x.k){if(!x.k.hasOwnProperty(w)){continue}if(x.k[w] instanceof Object){u=x.k[w]}else{u=x.k;w="keyword"}for(var r in u){if(!u.hasOwnProperty(r)){continue}x.k[r]=[w,u[r]];s.push(r)}}}if(!v){if(x.bWK){x.b="\\b("+s.join("|")+")\\s"}x.bR=f(y,x.b?x.b:"\\B|\\b");if(!x.e&&!x.eW){x.e="\\B|\\b"}if(x.e){x.eR=f(y,x.e)}}if(x.i){x.iR=f(y,x.i)}if(x.r===undefined){x.r=1}if(!x.c){x.c=[]}x.compiled=true;for(var t=0;t<x.c.length;t++){if(x.c[t]=="self"){x.c[t]=x}q(x.c[t],y,false)}if(x.starts){q(x.starts,y,false)}}for(var p in e){if(!e.hasOwnProperty(p)){continue}q(e[p].dM,e[p],true)}}function d(B,C){if(!j.called){j();j.called=true}function q(r,M){for(var L=0;L<M.c.length;L++){if((M.c[L].bR.exec(r)||[null])[0]==r){return M.c[L]}}}function v(L,r){if(D[L].e&&D[L].eR.test(r)){return 1}if(D[L].eW){var M=v(L-1,r);return M?M+1:0}return 0}function w(r,L){return L.i&&L.iR.test(r)}function K(N,O){var M=[];for(var L=0;L<N.c.length;L++){M.push(N.c[L].b)}var r=D.length-1;do{if(D[r].e){M.push(D[r].e)}r--}while(D[r+1].eW);if(N.i){M.push(N.i)}return f(O,M.join("|"),true)}function p(M,L){var N=D[D.length-1];if(!N.t){N.t=K(N,E)}N.t.lastIndex=L;var r=N.t.exec(M);return r?[M.substr(L,r.index-L),r[0],false]:[M.substr(L),"",true]}function z(N,r){var L=E.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(L,P){L=m(L);if(!P.k){return L}var r="";var O=0;P.lR.lastIndex=0;var M=P.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=z(P,M);if(N){x+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=P.lR.lastIndex;M=P.lR.exec(L)}return r+L.substr(O,L.length-O)}function J(L,M){if(M.sL&&e[M.sL]){var r=d(M.sL,L);x+=r.keyword_count;return r.value}else{return F(L,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){y+=L;M.buffer=""}else{if(M.eB){y+=m(r)+L;M.buffer=""}else{y+=L;M.buffer=r}}D.push(M);A+=M.r}function G(N,M,Q){var R=D[D.length-1];if(Q){y+=J(R.buffer+N,R);return false}var P=q(M,R);if(P){y+=J(R.buffer+N,R);I(P,M);return P.rB}var L=v(D.length-1,M);if(L){var O=R.cN?"</span>":"";if(R.rE){y+=J(R.buffer+N,R)+O}else{if(R.eE){y+=J(R.buffer+N,R)+O+m(M)}else{y+=J(R.buffer+N+M,R)+O}}while(L>1){O=D[D.length-2].cN?"</span>":"";y+=O;L--;D.length--}var r=D[D.length-1];D.length--;D[D.length-1].buffer="";if(r.starts){I(r.starts,"")}return R.rE}if(w(M,R)){throw"Illegal"}}var E=e[B];var D=[E.dM];var A=0;var x=0;var y="";try{var s,u=0;E.dM.buffer="";do{s=p(C,u);var t=G(s[0],s[1],s[2]);u+=s[0].length;if(!t){u+=s[1].length}}while(!s[2]);if(D.length>1){throw"Illegal"}return{r:A,keyword_count:x,value:y}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:m(C)}}else{throw H}}}function g(t){var p={keyword_count:0,r:0,value:m(t)};var r=p;for(var q in e){if(!e.hasOwnProperty(q)){continue}var s=d(q,t);s.language=q;if(s.keyword_count+s.r>r.keyword_count+r.r){r=s}if(s.keyword_count+s.r>p.keyword_count+p.r){r=p;p=s}}if(r.language){p.second_best=r}return p}function i(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function n(t,w,r){var x=h(t,r);var v=a(t);var y,s;if(v){y=d(v,x)}else{return}var q=c(t);if(q.length){s=document.createElement("pre");s.innerHTML=y.value;y.value=k(q,c(s),x)}y.value=i(y.value,w,r);var u=t.className;if(!u.match("(\\s|^)(language-)?"+v+"(\\s|$)")){u=u?(u+" "+v):v}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){s=t.parentNode;var p=document.createElement("div");p.innerHTML="<pre><code>"+y.value+"</code></pre>";t=p.firstChild.firstChild;p.firstChild.cN=s.cN;s.parentNode.replaceChild(p.firstChild,s)}else{t.innerHTML=y.value}t.className=u;t.result={language:v,kw:y.keyword_count,re:y.r};if(y.second_best){t.second_best={language:y.second_best.language,kw:y.second_best.keyword_count,re:y.second_best.r}}}function o(){if(o.called){return}o.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=b(r[p]);if(q){n(q,hljs.tabReplace)}}}function l(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",o,false);window.addEventListener("load",o,false)}else{if(window.attachEvent){window.attachEvent("onload",o)}else{window.onload=o}}}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=n;this.initHighlighting=o;this.initHighlightingOnLoad=l;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.ER="(?![\\s\\S])";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(r,s){var p={};for(var q in r){p[q]=r[q]}if(s){for(var q in s){p[q]=s[q]}}return p}}();hljs.LANGUAGES.cpp=function(){var a={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1,restrict:1,_Bool:1,complex:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};return{dM:{k:a,i:"</",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},hljs.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:a,r:10,c:["self"]}]}}}();hljs.LANGUAGES.r={dM:{c:[hljs.HCM,{cN:"number",b:"\\b0[xX][0-9a-fA-F]+[Li]?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+(?:[eE][+\\-]?\\d*)?L\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+\\.(?!\\d)(?:i\\b)?",e:hljs.IMMEDIATE_RE,r:1},{cN:"number",b:"\\b\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"keyword",b:"(?:tryCatch|library|setGeneric|setGroupGeneric)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\.",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\d+(?![\\w.])",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\b(?:function)",e:hljs.IMMEDIATE_RE,r:2},{cN:"keyword",b:"(?:if|in|break|next|repeat|else|for|return|switch|while|try|stop|warning|require|attach|detach|source|setMethod|setClass)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"literal",b:"(?:NA|NA_integer_|NA_real_|NA_character_|NA_complex_)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"literal",b:"(?:NULL|TRUE|FALSE|T|F|Inf|NaN)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"identifier",b:"[a-zA-Z.][a-zA-Z0-9._]*\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"<\\-(?!\\s*\\d)",e:hljs.IMMEDIATE_RE,r:2},{cN:"operator",b:"\\->|<\\-",e:hljs.IMMEDIATE_RE,r:1},{cN:"operator",b:"%%|~",e:hljs.IMMEDIATE_RE},{cN:"operator",b:">=|<=|==|!=|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||\\$|:",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"%",e:"%",i:"\\n",r:1},{cN:"identifier",b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[hljs.BE],r:0},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"paren",b:"[[({\\])}]",e:hljs.IMMEDIATE_RE,r:0}]}};
hljs.initHighlightingOnLoad();
</script>


<!-- MathJax scripts -->
<script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/2.0-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>



</head>

<body>
<h1>Social Network Evolution and Meme Diffusion in a Student Dorm</h1>

<p>** Contact <a href="wdong@media.mit.edu">Wen Dong</a> or <a href="reid1001@gmail.com">Todd Reid</a> for any technical questions</p>

<h1></h1>

<h1>Introduction</h1>

<p>We conducted the Social Evolution experiment to closely track the everyday life of a whole undergraduate dormitory with mobile phones, so that social scientists can validate their models against the spatio-temporal patterns and behavior-network co-evolution as contained in this data. The Social Evolution experiment covered the locations, proximities, and phone calls of more than 80% of residents who lived in the dormitory used in the Social Evolution experiment, as captured by their cell phones from October 2008 to May 2009. This dormitory has a population of approximately 30 freshmen, 20 sophomores, 10 juniors, 10 seniors and 10 graduate student tutors. </p>

<p>This experiment was designed to study the adoption of political opinions, diet, exercise, obesity, eating habits, epidemiological contagion, depression and stress, dorm political issues, interpersonal relationships, and privacy.</p>

<p>Data collection includes proximity, location, and call log, collected through a cell-phone application that scans nearby Wi-Fi access points and Bluetooth devices every six minutes &mdash; referenced to the latitudes and longitudes of the Wi-Fi access points. Survey data includes Sociometric survey for relationships (choose from ‘friend’, ‘acquaintance’, or ‘don’t know’), Political opinions (democratic vs. republican), Recent smoking behavior, Attitudes towards exercise and fitness, Attitudes towards diet, Attitudes towards academic performance, Current confidence and anxiety level, music sharing from 1500 independent music tracks from a wide assortment of genres. The data are protected by MIT COUHES and related laws. </p>

<h1>Data Description</h1>

<p>Detailed description of the data is presented below:</p>

<ul>
<li><p>individual attributes and relationships captured by phone sensors (temporal resolution - 6 minutes):</p>

<ul>
<li><strong>Proximity.csv</strong> Bluetooth signal sent from whose mobile phone (user.id) and received by whose mobile phone (remote.user.id) and time, indicating the sender&#39;s mobile phone was within 10 meters of the receiver&#39;s mobile phone at the time of the record. We also included the probability (prob2) for the two person to be on the same floor in each record, estimated from Wi-Fi RSSI to access points. Proximity is an important media of meme diffusion.</li>
<li><strong>Calls.csv</strong> who (user_id) called which hashed phone numbers (dest_phone_hash, which uniquely identifies a phone number in the caller&#39;s phone), when (time_stamp), duration (duration), and user ID of the callee (dest_user_id_if_known) if the callee is also a subject in the experiment. Phone calls and SMS are indicators of friendship and important media of meme diffusion in the data set.</li>
<li><strong>SMS.csv</strong> who (user.id) sent short messages to which hashed phone numbers (dest_phone_hash), when (time), duration (duration), and user ID of the recipient (dest.user.id.if.known) if the recipient is also a subject in the experiment.</li>
<li><strong>WLAN.csv</strong> who (user_id) were within the range of which wireless local area network access points (WLAN AP, identified by wireless_mac), signal strength (strength), and when (time). WLAN AP scanning is an informative indicator of the instantaneous locations of the subjects, and hence the attributes of the subjects. We have encrypted the media access control (MAC) addresses of the access points according to IRB requirement.lab, classroom, student center, gym, restaurant, out of town, and more </li>
</ul></li>
<li><p>individual attributes, relationships and diffusion captured by survey data</p>

<ul>
<li><strong>Subjects.csv</strong> which year the subjects were in (year_school), and which living sector in the dorm building the subjects&#39; apartments were located in (floor). Living sector in the dormitory and year in school are the two major factors in demining relationships in the data set. Other personal information can be accessed through further IRB approval.</li>
<li><strong>RelationshipsFromSurveys.csv</strong> whether a subject (id.A) indicated he had a relationship (relationship) with another subject (id.B) at the time of survey (survey.date). The surveyed relationships are: close friends (CloseFriend), participated in at least two common activities per week (SocializeTwicePerWeek), discussed politics since the last survey (PoliticalDiscussant), shared all tagged Facebook photos (FacebookAllTaggedPhotos), shared blog/ live journal/ Twitter activities (BlogLivejournalTwitter).</li>
<li><strong>FluSymptoms.csv</strong> daily flu symptoms self-report of the subjects from 01/09/2009 to 04/25/2009. The symptoms include sore throat/ coughing (sore.throat.cough), runny nose/ congestion/ sneezing (runnynose.congestion.sneezing), fever (fever), nausea/vomiting/diarrhea (nausea.vomiting.diarrhea), sad/ depressed (sad.depressed), and stressed(often.stressed). Flu symptoms diffuse through in-person contact in this data set.</li>
<li><strong>Health.csv</strong> monthly self-reports of weight, height, number of salads per week (salads_per_week), number of fruits per day (fruits_per_day), whether the meals were considered healthy (health_diet), number of days per week with at least 20 minutes aerobic excercise (aerobic_per_week), number of sports per week (sports_per_week), whether smoking (current_smoking). Researchers have arguments on whether healthy lifestyle and health are infectious.</li>
<li><strong>Politics.csv</strong> political opinions and participation during 2008 presidential election, and political opinions after the election. Before election: whether interested in politics (interested_in_politics), preferred party (preferred_party), preferred candidate (preferred_candidate). After election: whether made the vote (did_vote_in_election), whether voted preferred candidate (not_voted_preferred_candidate), whether approving the president (approve_obama_president), whether approving the president&#39;s economy politics (approve_obama_economy), whether approving the congress (approve_congress).</li>
</ul></li>
</ul>

<!-- 
stress and emotion (monthly) 
career choice, (monthly) 
participation of student activity groups 
-->

<p>The following figure shows each socialization network, political discussant network, the Facebook network, the blog/Twitter network (columns 1-5) during December 2008, March 2009, April 2009 and May 2009 (rows 1-4). Each of the 20 images shows whether a given person A (x-axis) reported the stated relationship with a given person B (y-axis) in a specific month. We have reordered the participants so that friends go together. The friendship networks, the socialization networks, and the political discussant networks all take the block diagonal form, and the blocks represent different living sectors. Hence, relationships and living sectors have the most important interactions. The Facebook networks and blog/Twitter networks are the least structured. Some individuals reported relationships with all other residents in the student hall, especially towards the end of the academic year. This may indicate that by the end of the year all 84 residents in the small student dorm know one another, and distinguishing between the different relationships in the survey is a difficult task as a result. </p>

<pre><code class="r">zz = bzfile(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/RelationshipsFromSurveys.csv.bz2&quot;)
relationships = read.csv(zz)
relationships$id.A = factor(relationships$id.A, levels = 1:84)
relationships$id.B = factor(relationships$id.B, levels = 1:84)
relationships$relationship = factor(relationships$relationship, levels = c(&quot;SocializeTwicePerWeek&quot;, 
    &quot;CloseFriend&quot;, &quot;PoliticalDiscussant&quot;, &quot;FacebookAllTaggedPhotos&quot;, &quot;BlogLivejournalTwitter&quot;))
relationships.aggr = with(relationships[relationships$relationship == &quot;SocializeTwicePerWeek&quot;, 
    ], table(id.A, id.B))
relationships.cube = with(relationships, table(id.A, id.B, relationship, survey.date))
my.cor = function(m) cor(m + matrix(rnorm(prod(dim(m)), sd = sd(c(m)) * 0.01), 
    nrow = nrow(m)))
relationships.hclust = hclust(as.dist((1 - my.cor(relationships.aggr))^0.5), 
    , method = &quot;ward&quot;)
layout(matrix(1:30, nrow = 5, byrow = TRUE))
par(mar = c(1, 1, 1, 1))
for (i in 1:dim(relationships.cube)[3]) for (j in 1:dim(relationships.cube)[4]) {
    image(relationships.cube[relationships.hclust$order, relationships.hclust$order, 
        i, j], xaxt = &quot;n&quot;, yaxt = &quot;n&quot;)
    if (j == dim(relationships.cube)[4]) 
        mtext(dimnames(relationships.cube)[[3]][i], side = 4, cex = 0.7)
    if (i == dim(relationships.cube)[3]) 
        mtext(dimnames(relationships.cube)[[4]][j], side = 1)
}
</code></pre>

<p><img src="" alt="Students in the dormitory reported clusters of relationships in the surveys."/> </p>

<p>Friends also have a higher correlation in their on-campus activities, as indicated by the monthly surveys. From September 2008 to May 2009, 15 friend pairs each shared all on-campus activities that we surveyed, and 30% of friend pairs shared over 50% of their on-campus activities. In comparison, non-friends shared less than 10% of on-campus activities. In particular, pairs who participated aerobic exercise about three times weekly were more likely to be friends. While the surveys show significant correlation between activity participation and friendship (hypothesis that the correlation of friends&#39; activity participation has the same probability distribution as the correlation of non-friends&#39; was rejected with \( p<10^{-6} \)<br/>
  in a Kolmogorov-Smirnov test), activities and interactions collected by sensors are nonetheless necessary for estimating friendship or activities, as the surveys do not offer statistically-significant correlations between friendship and factors that do not require shared space and time, such as shared websites and shared music. </p>

<p>The left panel of the following figure compares activity participation between friend pairs and non-friend pairs with a quantile-quantile plot (QQ plot). A QQ plot compares the probability distributions of two samples. When the two samples (participation correlations among friends and participation correlations among non-friends) have equal sizes, the QQ plot draws in a coordinate system the lowest value in one sample (non-friends) against the lowest value in the other sample, draws the second-lowest value in one sample against the second-lowest value in the other sample, and so on. When the two samples have different sizes, the QQ plot interpolates the values in the two samples. The digits 1-9 in this panel mark the 0.1-0.9 percentiles in the two distributions. For example, 20% of friend pairs and 5% of non-friend pairs (marked by red digit 8) have activity correlations greater than 0.4. If we identify friends as those whose activity correlations are greater than 0.4, we can successfully identify the 20% of friend pairs with the highest activity correlations, but also misidentify the 5% of non-friend pairs with the highest activity correlations as friend pairs. </p>

<p>The right panel of the following figure shows the odds that two individuals will be friends given that they perform certain numbers of aerobic exercises per week. When both individuals participate in around three aerobic activities per week, they have higher odds of being friends. This suggests that friendship determines behavior, because otherwise it is hard to explain why people who do 2.5 aerobic activities per week like those who do 2.5 aerobic activities per week, but people who do 3.5 aerobic activities per week like those who do 3.5 aerobic activities per week. When both individuals have one and fewer aerobic activities per week they are more likely to be non-friends. This seems to suggest that physical exercise is an additional factor other than shared living sector and shared courses that also shape friendship relations. </p>

<pre><code class="r">layout(matrix(1:2, nrow = 1, byrow = TRUE))
# par(mar=c(1,1,1,1))
org = read.csv(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/Activities.csv&quot;)
org$user.id = factor(org$user.id, levels = 1:84)
user.org = table(org$user.id, org$campus.organization)
my.cor = function(m) cor(m + matrix(rnorm(prod(dim(m)), sd = sd(c(m)) * 0.01), 
    nrow = nrow(m)))
adj.matrix = relationships.cube[, , &quot;CloseFriend&quot;, &quot;2008-12-13&quot;]
x = split(my.cor(t(user.org[as.character(1:84), ]))[upper.tri(adj.matrix)], 
    adj.matrix[upper.tri(adj.matrix)])
qqplot(x[[1]], x[[2]], pch = &quot;.&quot;, xlab = &quot;non-friends&quot;, ylab = &quot;friends&quot;, sub = &quot;correlation of on-campus activity&quot;, 
    main = &quot;QQ-plot&quot;)
lines(-1:1, -1:1, col = &quot;red&quot;)
points(quantile(x[[1]], 1:9/10), quantile(x[[2]], 1:9/10), pch = as.character(1:9), 
    col = &quot;red&quot;)
#
physical = read.csv(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/Health.csv&quot;)
aerobic = with(physical, tapply(aerobic_per_week, data.frame(user_id, survey.month), 
    mean))
aerobic = aerobic[rowSums(!is.na(aerobic)) &gt; 0, ]
library(MASS)
## Loading required package: MASS
edge.list = which(relationships.cube[dimnames(aerobic)[[&quot;user_id&quot;]], dimnames(aerobic)[[&quot;user_id&quot;]], 
    &quot;CloseFriend&quot;, &quot;2008-12-13&quot;] &gt; 0, arr.ind = TRUE)
f1 &lt;- kde2d(rowMeans(aerobic, na.rm = TRUE)[edge.list[, 1]], rowMeans(aerobic, 
    na.rm = TRUE)[edge.list[, 2]], n = 8)
edge.list = which(relationships.cube[dimnames(aerobic)[[&quot;user_id&quot;]], dimnames(aerobic)[[&quot;user_id&quot;]], 
    &quot;CloseFriend&quot;, &quot;2008-12-13&quot;] == 0, arr.ind = TRUE)
f2 &lt;- kde2d(rowMeans(aerobic, na.rm = TRUE)[edge.list[, 1]], rowMeans(aerobic, 
    na.rm = TRUE)[edge.list[, 2]], n = 8)
contour(x = f1$x, y = f1$y, z = exp(asinh(f1$z) - asinh(f2$z)), xlab = &quot;person A&quot;, 
    ylab = &quot;person B&quot;, main = &quot;odds of being friends&quot;, sub = &quot;aerobic per week&quot;)
lines(0:7, 0:7, col = &quot;gray&quot;)
</code></pre>

<p><img src="" alt="plot of chunk RH-activity-diffusion"/> </p>

<p>The sensors on subjects&#39; mobile phones captured meaningful information on who the subjects were, whom the subjects interacted with, and how information, opinion, virus and other things diffused among the subjects, just like the surveys did. However, electronic devices could track and help individuals continuously without intervention, while surveys require significant intention from the individuals.</p>

<p>The sensor records of phone calls, short messages, and proximity reveal different types of relationships parellel the self-reported relationships at a much finer time scale and can be collected with much less human intervention. To illustrate this, we show how well these sensor records predict the subjects&#39; self-reported <code>close friend&#39;&#39; relationship and</code>meeting more than twice per week&#39;&#39; relationship at the middle of the experiment. We simply predict that two persons would report the relationship under investigation if they had more than a threshold amount of phone calls, short messages or proximity records during the whole experiment, and we plot the amount of correct vs wrong prediction at different thresholds and a performance indicator (the following two figures). </p>

<p>Different sensor data have different trade-offs in predicting reported relationships. When two subjects made voice calls to each other, we can predict that they were very likely to report themselves as friends and hence they were very likely to report themselves to get together at least twice per week in some meaningful events (from 0 to 250 correct predictions in black line). However, since subjects often socialize with non-friends who never made any voice calls to one another, a big fraction of self-reported sociolization could not be predicted with voice calls. If two persons were within 10 meters distance (proximity) and on the same floor, they would very likely report themselves to be socializing with each other. However, two persons might be in proximity very often without realizing the presence of each other. As a reference, whether two persons were in the same dormitory floor performs closer to voice call.</p>

<pre><code class="r">users = read.csv(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/Subjects.csv&quot;)
zz = bzfile(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/Calls.csv.bz2&quot;, 
    open = &quot;rt&quot;)
calls = read.csv(file = zz)
close(zz)
calls$user_id = ordered(calls$user_id, levels = 1:84)
calls$dest_user_id_if_known = ordered(calls$dest_user_id_if_known, levels = 1:84)
calls.adjmat = table(calls$user_id, calls$dest_user_id_if_known)
zz = bzfile(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/SMS.csv.bz2&quot;, 
    open = &quot;rt&quot;)
sms = suppressWarnings(read.csv(file = zz))
close(zz)
sms$user.id = ordered(sms$user.id, levels = 1:84)
sms$dest.user.id.if.known = ordered(sms$dest.user.id.if.known, levels = 1:84)
sms.adjmat = table(sms$user.id, sms$dest.user.id.if.known)
same.floor.adjmat = outer(users$floor, users$floor, &quot;==&quot;)
zz = bzfile(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/Proximity.csv.bz2&quot;, 
    open = &quot;rt&quot;)
proximity = read.csv(file = zz)
close(zz)
proximity$user.id = ordered(proximity$user.id, levels = 1:84)
proximity$remote.user.id.if.known = ordered(proximity$remote.user.id.if.known, 
    levels = 1:84)
proximity.adjmat = table(proximity$user.id, proximity$remote.user.id.if.known)
proximity.floor.adjmat = tapply(proximity$prob2, proximity[, c(&quot;user.id&quot;, &quot;remote.user.id.if.known&quot;)], 
    sum, na.rm = TRUE)
</code></pre>

<pre><code class="r">make.ordered.dyads = function(adjmat, label.mat) {
    dyads.ordered = data.frame(A = c(row(adjmat), col(adjmat)), B = c(col(adjmat), 
        row(adjmat)), score = rep(c(adjmat), 2)/2, friend = rep(c(label.mat), 
        2))
    dyads.ordered[order(dyads.ordered$score, decreasing = TRUE), ]
}
calls.dyads.ordered = make.ordered.dyads(calls.adjmat, relationships.cube[, 
    , &quot;SocializeTwicePerWeek&quot;, &quot;2008-12-13&quot;])
plot(cumsum(calls.dyads.ordered$friend == 0), cumsum(calls.dyads.ordered$friend &gt; 
    0), type = &quot;l&quot;, lty = 1, col = 1, xlab = &quot;number of incorrect predictions&quot;, 
    ylab = &quot;number of correct predictions&quot;, main = &quot;socializing twice per week&quot;)
sms.dyads.ordered = make.ordered.dyads(sms.adjmat, relationships.cube[, , &quot;SocializeTwicePerWeek&quot;, 
    &quot;2008-12-13&quot;])
lines(cumsum(sms.dyads.ordered$friend == 0), cumsum(sms.dyads.ordered$friend &gt; 
    0), lty = 2, col = 2)
same.floor.dyads.ordered = make.ordered.dyads(same.floor.adjmat, relationships.cube[, 
    , &quot;SocializeTwicePerWeek&quot;, &quot;2008-12-13&quot;])
lines(cumsum(same.floor.dyads.ordered$friend == 0), cumsum(same.floor.dyads.ordered$friend &gt; 
    0), lty = 3, col = 3)
proximity.dyads.ordered = make.ordered.dyads(proximity.adjmat, relationships.cube[, 
    , &quot;SocializeTwicePerWeek&quot;, &quot;2008-12-13&quot;])
lines(cumsum(proximity.dyads.ordered$friend == 0), cumsum(proximity.dyads.ordered$friend &gt; 
    0), lty = 4, col = 4)
proximity.floor.dyads.ordered = make.ordered.dyads(proximity.floor.adjmat, relationships.cube[, 
    , &quot;SocializeTwicePerWeek&quot;, &quot;2008-12-13&quot;])
lines(cumsum(proximity.floor.dyads.ordered$friend == 0), cumsum(proximity.floor.dyads.ordered$friend &gt; 
    0), lty = 5, col = 5)
legend(&quot;bottomright&quot;, lty = 1:5, col = 1:5, legend = c(&quot;voice call&quot;, &quot;SMS&quot;, 
    &quot;same dorm floor&quot;, &quot;proximity&quot;, &quot;proximity+Wi-Fi RSSI&quot;))
</code></pre>

<p><img src="" alt="plot of chunk RH-relationship-sensor-survey"/> </p>

<p>In the following plot, we compare the reported relationship (SocializeTwicePerWeek) with aggregated dyadic relationships from sensors represented by adjacency matrices. Investigators of this data set can compare the adjacency matrices below with the ROC curves above. </p>

<pre><code class="r">layout(matrix(1:6, nrow = 2, byrow = TRUE))
image(x = 1:84, y = 1:84, z = relationships.cube[relationships.hclust$order, 
    relationships.hclust$order, &quot;SocializeTwicePerWeek&quot;, &quot;2008-12-13&quot;], xaxt = &quot;n&quot;, 
    yaxt = &quot;n&quot;, xlab = &quot;&quot;, ylab = &quot;&quot;, main = &quot;reported socialization&quot;)
image(x = 1:84, y = 1:84, z = sms.adjmat[relationships.hclust$order, relationships.hclust$order] &gt; 
    0, xaxt = &quot;n&quot;, yaxt = &quot;n&quot;, xlab = &quot;&quot;, ylab = &quot;&quot;, main = &quot;SMS&quot;)
image(x = 1:84, y = 1:84, z = calls.adjmat[relationships.hclust$order, relationships.hclust$order] &gt; 
    0, , xaxt = &quot;n&quot;, yaxt = &quot;n&quot;, xlab = &quot;&quot;, ylab = &quot;&quot;, main = &quot;voice call&quot;)
image(x = 1:84, y = 1:84, z = ifelse(is.na(same.floor.adjmat), 0, same.floor.adjmat)[relationships.hclust$order, 
    relationships.hclust$order] &gt; 0, xaxt = &quot;n&quot;, yaxt = &quot;n&quot;, xlab = &quot;&quot;, ylab = &quot;&quot;, 
    main = &quot;same floor&quot;)
image(x = 1:84, y = 1:84, z = asinh(10 * sweep(ifelse(is.na(proximity.floor.adjmat), 
    0, proximity.floor.adjmat), 1, rowSums(proximity.floor.adjmat, na.rm = TRUE) + 
    1e-06, &quot;/&quot;)[relationships.hclust$order, relationships.hclust$order]), xaxt = &quot;n&quot;, 
    yaxt = &quot;n&quot;, xlab = &quot;&quot;, ylab = &quot;&quot;, main = &quot;proximity+Wi-Fi&quot;)
image(x = 1:84, y = 1:84, z = asinh(10 * sweep(ifelse(is.na(proximity.adjmat), 
    0, proximity.adjmat), 1, rowSums(proximity.adjmat, na.rm = TRUE) + 1e-06, 
    &quot;/&quot;)[relationships.hclust$order, relationships.hclust$order]), , xaxt = &quot;n&quot;, 
    yaxt = &quot;n&quot;, xlab = &quot;&quot;, ylab = &quot;&quot;, main = &quot;proximity&quot;)
</code></pre>

<p><img src="" alt="plot of chunk RH-adjmat-sensor-survey"/> </p>

<p>The sensor records of Wi-Fi access point within range collected by personal mobile phones parellel the subjects&#39; self-reports on who they were and what they did, at a much finer time scale and with much less human intervention. We make sense of the Wi-Fi data by collecting information about the access points. The following figure is a heat map showing how individuals visited places daily. The x-axis is indexed by Wi-Fi access points, and the y-axis is indexed by time during the week from Monday morning to Saturday at midnight. An entry shows how often the residents accessed a Wi-Fi access point in a specific hour in the week. The Wi-Fi access points on the left side were in the dormitory building, and so had many accesses from midnight to morning. The Wi-Fi access points on the right had high usage during work hours, and correspond to the classrooms and offices. The Wi-Fi access points in the middle show high usage from evening to midnight, and correspond to fitness centers and the student activity center. (We can not publish the latitudes, longitudes, building floors, and MAC addresses of the access points, since otherwise the investigators of this data set can estimate the subjects&#39; instantaneous positions, buildings and room numbers from the RSSI to Wi-Fi access points.)</p>

<pre><code class="r">zz = bzfile(&quot;~/Google Drive/SBP2013challenge/Data/SocialEvolution/WLAN2.csv.bz2&quot;, 
    open = &quot;rt&quot;)
wlan = read.csv(file = zz)
close(zz)
wlan$time = as.POSIXct(&quot;1970-1-1&quot;, tz = &quot;America/New_York&quot;) + wlan$unix_time
wlan.time = with(wlan[with(wlan, which(wireless_mac %in% head(names(sort(table(wlan$wireless_mac), 
    decreasing = TRUE)), 512))), c(&quot;wireless_mac&quot;, &quot;time&quot;)], table(wireless_mac, 
    strftime(time, &quot;%w&amp;%H&quot;)))
wlan.time[is.na(wlan.time)] = 0
v = hclust(as.dist(sqrt(1 - cor(t(asinh(wlan.time))))), method = &quot;ward&quot;)
image(x = 1:nrow(wlan.time), y = 1:ncol(wlan.time), z = asinh(wlan.time[v$order, 
    ]), xlab = &quot;wifi hotspots&quot;, ylab = &quot;time in one week&quot;, xaxt = &quot;n&quot;, yaxt = &quot;n&quot;)
abline(h = seq(24, 24 * 7, by = 24))
</code></pre>

<p><img src="" alt="The student dormitory community cycled among dormitory (left), athletic center (middle) and classroom/office (right) from Sunday (bottom stripe) to Saturday (upper stripe), as indicated by Wi-Fi access-point usage."/> </p>

<h1>Literature Review</h1>

<p>The following findings have been reported.</p>

<p>Dong and colleagues [1] showed that the subjects chose friends according to how often they see one another, and influence one another in participating physical exercises, participating student activities, diet, and others. They further proposed a stochastic process model to capture the co-evolution of social relationship and individual behavior with 12 events. They showed that such a stochastic process model could help researchers to interpolate between surveys with sensor data, and could potentially anonymize the “human behavior trails” through a resampling.</p>

<p>Dong and colleagues [2] showed that it is possible to fit agent based models with the “data exhaust trails” of networked people by identifying agent based models as stochastic processes, through a case study that tells who infects whom in real-world social network.</p>

<p>Madan and colleagues were able to track stress, sadness, and flu by looking at how the subjects moved around, how much they talked to the others, and when they talked to the others [3]. They were also able to explain the change of weight of a subject by the weight changes of his contacts on a weekly basis [4].</p>

<p>Madan and colleagues inspected the political opinions and discussions of the subjects during the 2008 presidential election. They found that people tended to be close to those with the same political opinions during the presidential debates using Bluetooth scanning [5].</p>

<h1>References</h1>

<ol>
<li>Wen Dong, Bruno Lepri, and Alex Pentland. Modeling the co-evolution of behaviors and social relationships using mobile phone data. In MUM, pages 134-143, 2011.</li>
<li>Wen Dong, Katherine A. Heller, and Alex Pentland. Modeling infection with multi-agent dynamics. In SBP, pages 172{179, 2012.</li>
<li>Anmol Madan, Manuel Cebrian, David Lazer, and Alex Pentland. Social sensing for epidemiological behavior change. In UbiComp, pages 291{300, 2010.</li>
<li>Anmol Madan, Sai T. Moturu, David Lazer, and Alex Pentland. Social sensing: obesity, unhealthy eating and exercise in face-to-face networks. In Wireless Health, pages 104-110, 2010.</li>
<li>Anmol Madan, Katayoun Farrahi, Daniel Gatica-Perez, and Alex Pentland. Pervasive sensing to model political opinions in face-to-face networks. In Pervasive, pages 214{231, 2011.</li>
</ol>

</body>

</html>

